package com.xxx.topic;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

/**
 * Rabbit MQ使用场景五：根据topic发布消息
 * 同一个消息被多个消费者获取。一个消费者队列可以有多个消费者实例，只有其中一个消费者实例会消费到消息。
 * 
 * @author guweiqiang
 * 2018年6月13日
 */
public class TopicPublisher {
	
//	private static final String HOST = "localhost";
	private static final String EXCHANGE_NAME = "test_topic";
	private static final String TOPIC_NAME = "topic";
	
	// 1个topic下可以包含多个routingKey
	private static final String[] routingKeys = new String[] {
            	"quick.orange.rabbit",
            	"lazy.orange.elephant",
            	"quick.orange.fox",
            	"lazy.brown.fox",
            	"quick.brown.fox",
            	"quick.orange.male.rabbit",
            	"lazy.orange.male.rabbit"
    };

	public static void main(String[] args) throws IOException, TimeoutException {
		// 1.创建连接工厂，并设置工厂相关属性
		ConnectionFactory factory = new ConnectionFactory();
//		factory.setHost(HOST); // 默认为localhost
		
		// 2.创建一个连接
		Connection connection = factory.newConnection();
		
		// 3.创建一个通道
		Channel channel = connection.createChannel();
		
		// 4.声明交换机
		channel.exchangeDeclare(EXCHANGE_NAME, TOPIC_NAME); // topic表示匹配模式
		
		// 5.发送消息
		for(String routingKey : routingKeys) {
			String message = "hello rabbit mq:" + routingKey;
			channel.basicPublish(EXCHANGE_NAME, routingKey, null, message.getBytes()); // 按路由关键字分发
			// 第一个参数为交换机名称
			// 第二个参数为队列映射的路由key
			// 第三个参数为消息的其他属性
			// 第四个参数为发送信息的主体
			System.out.println("Publisher send topic message: " + message);
		}
		
		// 6.关闭连接
		channel.close();
        connection.close();
	}

}
